package com.xbongbong.paas.service.alipay.impl;

import com.xbongbong.alipay.config.AlipayConfig;
import com.xbongbong.alipay.sign.RSA;
import com.xbongbong.alipay.util.AlipayCore;
import com.xbongbong.paas.constant.PaasConstant;
import com.xbongbong.paas.service.alipay.SmsAlipayService;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.util.URLEncodeUtils;
import com.xbongbong.pro.enums.PackageTypeEnum;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * @description: 短信套餐支付
 * @Author: hongxiao
 * @date: 2019-09-12 15:52
 * @since v1.0
 */
@Service("SmsAlipayService")
public class SmsAlipayServiceImpl implements SmsAlipayService {

    @Override
    public String getMobileSMSPayInfo(Integer feeType, String serviceUrl, String outTradeNo, String totalFee, String corpid) throws XbbException {
        // 对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
        Map<String, String> sParaTemp = setSMSPayParam(feeType, serviceUrl , outTradeNo, totalFee ,corpid);
        // 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
        String prestr = AlipayCore.createLinkString(sParaTemp);
        String mysign = "";
        if(AlipayConfig.sign_type.equals("RSA") ){
            mysign = RSA.sign(prestr, AlipayConfig.private_key, AlipayConfig.input_charset);
        }
        mysign= URLEncodeUtils.encodeURL(mysign);
        String info  = prestr+ "&sign="+mysign+"&sign_type=RSA";
        return info;
    }


    /**
     * 拼接短信套餐支付宝支付参数
     *
     * @param feeType 套餐类型
     * @param serviceUrl 服务地址
     * @param outTradeNo 订单号
     * @param totalFee 总费用
     * @param corpid 公司id
     * @return
     * @throws
     * @author hongxiao
     * @date 2019-09-16 10:29
     * @since v1.0
     * @version v1.0
     */
    private Map<String, String> setSMSPayParam(Integer feeType, String serviceUrl, String outTradeNo, String totalFee, String corpid) {
        String subject  = "";
        String body  = "";

        PackageTypeEnum packageTypeEnum = PackageTypeEnum.getByType(feeType);

        switch (packageTypeEnum) {
            case SMS:
                subject = "销帮帮CRM短信充值";
                body = "销帮帮CRM短信充值，订单编号:" + outTradeNo;
                break;
            case ESIGN:
                subject = "销帮帮CRM电子合同充值";
                body = "销帮帮CRM电子合同充值，订单编号:" + outTradeNo;
                break;
            default:
                break;
        }

        //服务器异步通知页面路径	//需http://格式的完整路径，不能加?id=123这类自定义参数
        // 测试环境和生产环境配置自带pro，只有开发环境需要加上
        String notify_url = serviceUrl + "v1/mobile/alipay/notify/sms";
        //页面跳转同步通知页面路径//需http://格式的完整路径，不能加?id=123这类自定义参数，不能写成http://localhost/
        //String return_url = basicurl+ "/alipay/return/sms.html";
        //把请求参数打包成数组
        Map<String, String> sParaTemp = new HashMap<>(PaasConstant.DEFAULT_INITIAL_CAPACITY);
        // 接口名
        sParaTemp.put("service",  "mobile.securitypay.pay");
        // 签约的支付宝账号对应的支付宝唯一用户号。以2088开头的16位纯数字组成。
        sParaTemp.put("partner", AlipayConfig.partner);
        sParaTemp.put("seller_id", AlipayConfig.seller_id);
        // 商户网站使用的编码格式，如utf-8、gbk、gb2312等。
        sParaTemp.put("_input_charset", AlipayConfig.input_charset);
        // 取值范围请参见附录“12.6 收款类型”。默认值为：1（商品购买）。
        sParaTemp.put("payment_type", AlipayConfig.payment_type);
        // 支付宝服务器主动通知商户网站里指定的页面http路径。
        sParaTemp.put("notify_url", notify_url);
        // 商品的标题/交易标题/订单标题/订单关键字等。该参数最长为128个汉字。
        sParaTemp.put("subject", subject);
        // 支付宝合作商户网站唯一订单号。
        sParaTemp.put("out_trade_no", outTradeNo);
        /*
         * 该笔订单的资金总额，单位为RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位。规则：price、quantity能代替total_fee。
         * 即存在total_fee，就不能存在price和quantity；存在price、quantity，就不能存在total_fee。
         */
        sParaTemp.put("total_fee", totalFee);
        // 收银台页面上，商品展示的超链接。
        sParaTemp.put("body", body);

        return sParaTemp;
    }
}
